"""
错误处理器
"""

from flask import jsonify
from werkzeug.exceptions import HTTPException
from sqlalchemy.exc import IntegrityError
from marshmallow import ValidationError
from flask_jwt_extended.exceptions import JWTExtendedException


def register_error_handlers(app):
    """注册错误处理器"""
    
    @app.errorhandler(400)
    def bad_request(error):
        return jsonify({
            'error': '请求参数错误',
            'message': str(error.description) if hasattr(error, 'description') else 'Bad Request'
        }), 400
    
    @app.errorhandler(401)
    def unauthorized(error):
        return jsonify({
            'error': '未授权访问',
            'message': '请先登录'
        }), 401
    
    @app.errorhandler(403)
    def forbidden(error):
        return jsonify({
            'error': '禁止访问',
            'message': '权限不足'
        }), 403
    
    @app.errorhandler(404)
    def not_found(error):
        return jsonify({
            'error': '资源不存在',
            'message': '请求的资源未找到'
        }), 404
    
    @app.errorhandler(405)
    def method_not_allowed(error):
        return jsonify({
            'error': '方法不允许',
            'message': '请求方法不被允许'
        }), 405
    
    @app.errorhandler(422)
    def unprocessable_entity(error):
        return jsonify({
            'error': '请求参数错误',
            'message': '请求参数无法处理'
        }), 422
    
    @app.errorhandler(500)
    def internal_error(error):
        return jsonify({
            'error': '服务器内部错误',
            'message': '服务器遇到内部错误'
        }), 500
    
    @app.errorhandler(IntegrityError)
    def handle_integrity_error(error):
        return jsonify({
            'error': '数据完整性错误',
            'message': '数据违反唯一性约束'
        }), 400
    
    @app.errorhandler(ValidationError)
    def handle_validation_error(error):
        return jsonify({
            'error': '数据验证错误',
            'message': error.messages
        }), 400
    
    @app.errorhandler(JWTExtendedException)
    def handle_jwt_error(error):
        return jsonify({
            'error': 'JWT令牌错误',
            'message': '令牌无效或已过期'
        }), 401
    
    @app.errorhandler(HTTPException)
    def handle_http_exception(error):
        return jsonify({
            'error': error.name,
            'message': error.description
        }), error.code
    
    @app.errorhandler(Exception)
    def handle_generic_exception(error):
        app.logger.error(f"未处理的异常: {str(error)}")
        return jsonify({
            'error': '服务器错误',
            'message': '服务器遇到未知错误'
        }), 500
